#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10000 + 5;

// 邻接表结构
struct Edge 
{
    int from, to, cap, flow;
    Edge(int fr, int t, int c, int f) : from(fr), to(t), cap(c), flow(f){}    
};
vector<Edge> edges;
vector<int> G[MAXN]; 

int a[MAXN];        /* 起点到aa的可改进量*/
int p[MAXN];        /* 最短路树上的入弧编号*/

// 向邻接表中添加边, 增加一个正向残量，引入一个反向残量
void addEdge(int from, int to, int cap) 
{
    int m = -1;
    edges.push_back(Edge(from, to, cap, 0));
    edges.push_back(Edge(to, from, 0, 0));
    m = edges.size();
    G[from].push_back(m - 2);
    G[to].push_back(m - 1);    
} 

// 最大流算法
int MaxFlow(int s, int t)
{
    int flow = 0;                            /* 结果*/
    for(;;) 
    {
        memset(a, 0, sizeof(a));
        queue<int> Q;
        Q.push(s);
        a[s] = INT_MAX;
        while(!Q.empty())
        {
            int x = Q.front(); Q.pop();

            // 遍历邻街边
            for(int i = 0; i < G[x].size(); i++)
            {
                Edge & e = edges[G[x][i]];
                
                // 此条边可以进行曾广
                if(!a[e.to] && e.cap > e.flow)
                {
                    p[e.to] = G[x][i];
                    a[e.to] = min(a[x], e.cap - e.flow);
                    Q.push(e.to);
                }
            }

            // 找到了增广路
            if(a[t]) break;
        }           

        // 找不到增广路
        if(!a[t]) break;

        // 更新残量图
        for(int u = t; u != s; u = edges[p[u]].from) 
        {
            edges[p[u]].flow += a[t];
            edges[p[u] ^ 1].flow -= a[t];
        }
        flow += a[t];
    }
    return flow;
}

int main()
{
#ifdef LOCAL
    freopen("ALGO-247.in", "r", stdin);
#endif
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n, m, x, y, z; cin >> n >> m;
 
    while(m--)
    {
        cin >> x >> y >> z;
        addEdge(x, y, z);
    }
    
    int ans = MaxFlow(1, n);
    cout << ans << endl;
    return 0;
}